from django.db import models
from create.models import Story
from user.models import User


# Create your models here.
class Comment(models.Model):
    """评论模型：精准适配你的User和Story模型"""
    # 1. 关联评论作者（自定义User模型，适配head_img、nikename字段）
    user = models.ForeignKey(
        User,
        on_delete=models.CASCADE,  # 逻辑：用户被删除时，其所有评论也删除（如需保留评论，可改为 SET_NULL + null=True）
        related_name="story_comments",  # 反向查询：通过用户查所有评论 → user.story_comments.all()
        verbose_name="评论作者"
    )

    # 2. 关联评论所属故事（你的Story模型，适配creator、category等字段）
    story = models.ForeignKey(
        Story,
        on_delete=models.CASCADE,  # 逻辑：故事被删除时，关联的所有评论也删除
        related_name="story_comments",  # 反向查询：通过故事查所有评论 → story.story_comments.all()
        verbose_name="所属故事"
    )

    # 3. 评论核心字段（支持嵌套回复）
    content = models.TextField(verbose_name="评论内容")  # 评论正文
    parent = models.ForeignKey(
        "self",  # 自关联：支持评论回复（如A回复B的评论）
        on_delete=models.CASCADE,
        null=True,
        blank=True,
        related_name="replies",  # 反向查询：通过父评论查所有回复 → comment.replies.all()
        verbose_name="父评论"
    )
    created_time = models.DateTimeField(auto_now_add=True, verbose_name="评论时间")  # 自动记录发布时间
    is_active = models.BooleanField(default=True, verbose_name="是否有效")  # 软删除：标记无效而非物理删除

    # 4. 元数据配置（优化查询和后台显示）
    class Meta:
        verbose_name = "故事评论"
        verbose_name_plural = "故事评论管理"
        ordering = ["-created_time"]  # 按评论时间倒序（最新评论在前）
        indexes = [
            models.Index(fields=["story", "created_time"]),  # 优化「按故事+时间查评论」的速度
            models.Index(fields=["user"]),  # 优化「按用户查评论」的速度
        ]

    # 5. 后台显示文案（直观展示评论关联信息）
    def __str__(self):
        # 格式：评论作者昵称 → 所属故事标题（评论前20字）
        return f"{self.user.nikename or self.user.username} → 《{self.story.title}》：{self.content[:20]}"

    # 6. 自定义方法（适配你的User模型字段，方便前端调用）
    def get_user_avatar(self):
        """获取评论作者的头像（适配User模型的head_img字段，无头像时用默认图）"""
        # 你的User模型默认头像路径为 'user_img/head_img.jpg'，直接复用
        return self.user.head_img.url if self.user.head_img else '/static/user_img/head_img.jpg'

    def get_user_nickname(self):
        """获取评论作者的昵称（优先用nikename，无则用username）"""
        return self.user.nikename if self.user.nikename else self.user.username